package gdf

import (
	"net/http"
	"os"
	"sync"
)

// DownloadThreadController 下载线程控制器
type DownloadThreadController struct {
	TaskQueue              chan DownloadTask       // 用于接收下载任务
	TaskCount              chan int                // 用于记载当前任务数量
	Exit                   chan int                // 用于记载当前任务数量
	ThreadCount            int                     // 最大协程数
	WaitGroup              sync.WaitGroup          // 等待协程完成
	RangeStrs              map[int]string          // 所有需要下载的文件名
	FileUrl                string                  // 下载链接
	DownloadResultInfoChan chan DownloadFileParams // 下载任务响应通道
	DownloadFolder         string                  // 下载文件保存文件夹
	DownloadFileName       string                  // 下载文件保存文件名
	Filenames              []string                // 子文件名，有序
	Save                   bool                    // 是否保存文件
}

// DownloadTask 定义了一个下载任务的结构体。
// 它包含一个自定义函数和相应的参数信息，用于执行特定的下载任务。
type DownloadTask struct {
	// customFunc 是一个自定义的函数，用于执行下载任务的具体操作。
	// 该函数接受一个 interface{} 类型的参数，可以根据实际需要传递不同类型的参数来定制化任务执行。
	customFunc func(params interface{})

	// paramsInfo 是 customFunc 函数的参数信息。
	// 它是一个 interface{} 类型，可以存储任何类型的参数，提供了高度的灵活性来适应不同类型的下载任务。
	paramsInfo interface{}
}

// DownloadFileParams 定义了下载文件时所需的参数。
// 它包含了下载的URL、范围字符串、范围索引、临时文件名和下载是否成功的标志。
type DownloadFileParams struct {
	UrlStr       string // UrlStr 用于指定待下载文件的URL。
	RangeStr     string // RangeStr 用于指定下载文件时的范围，例如通过HTTP Range请求。
	RangeIndex   int    // RangeIndex 表示范围字符串中的起始索引，用于解析和处理范围请求。
	TempFilename string // TempFilename 是下载过程中临时文件的名称，用于存储部分或完整文件。
	Successes    bool   // Successes 标志下载操作是否成功，可用于后续处理或错误处理。
}

// Singleness 单文件下载
type Singleness struct {
	Request    *http.Request // Request 是一个HTTP请求对象，用于发送下载请求。
	File       *os.File      // File 是一个文件对象，用于存储下载的文件内容。
	FileSize   int64         // FileSize 表示下载文件的大小，用于计算下载进度。
	FileName   string        // FileName 是下载文件的名称，用于保存到本地。
	FileUrl    string        // FileUrl 是下载文件的URL，用于记录下载文件的来源。
	Debug      bool          // Debug 用于启用或禁用调试模式，在调试模式下可以打印下载过程中的信息。
	SaveToDisk bool          // 是否保存到硬盘
	Error      error         // Error 用于记录下载过程中发生的错误。
	MaxSize    int64         // MaxSize 用于限制下载文件的最大大小，超过限制会中断下载,默认: 500MB
}

// Thread 创建一个下载线程控制器
type Thread struct {
	ThreadCount      int      // 最大协程数
	SuppressRange    bool     // 是否支持分片下载
	FileUrl          string   // 下载链接
	SaveToDisk       bool     // 是否保存到硬盘
	DownloadFolder   string   // 下载文件保存文件夹
	ContentLength    int64    // 文件长度
	ContentSize      int      // 文件大小(MB)
	Filenames        []string // 子文件名，有序
	DownloadFileName string   // 下载文件保存文件名
	//RangeStrs        map[int]string // 所有需要下载的文件名
	Exit      bool           // 用于结束下载
	Debug     bool           // 是否开启调试
	Error     error          // 错误
	Request   *http.Request  // Request 是一个HTTP请求对象，用于发送下载请求。
	File      *os.File       // File 是一个文件对象，用于存储下载的文件内容。
	WaitGroup sync.WaitGroup // 等待协程完成
	Length    int64          // 设置单次下载长度,默认: 长度(ContentLength)除以线程数(ThreadCount)
	MemFree   int64          // 设置最小剩余内存,当剩余内存小于该数值则等待内存释放，默认: 100MB
}
